import type { AxiosResponse, InternalAxiosRequestConfig } from "axios";
import axios from "axios";
import qs from "qs";
import { ResultEnum } from "@/enums/ResultEnum";
import { getSession } from "@/utils/sessionManager.ts";

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API, // 从环境变量获取API基础URL
  timeout: 600000, // 请求超时时间
  headers: { "Content-Type": "application/json;charset=utf-8" },
  paramsSerializer: (params) => qs.stringify(params),
});

// 请求拦截器
service.interceptors.request.use(
  async (config: InternalAxiosRequestConfig) => {
    config.headers["X-Session-Id"] = localStorage.getItem("sessionId");
    // 添加时间戳防止缓存
    if (config.method?.toUpperCase() === "GET") {
      config.params = { ...config.params, _t: Date.now() };
    }
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    console.error("Request error:", error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 如果响应是二进制流，则直接返回，用于下载文件、Excel 导出等
    if (response.config.responseType === "blob") {
      return response;
    }
    const { code, result, data, message } = response.data;
    // 优先使用 result 字段，如果没有则使用 data 字段（兼容性处理）
    const responseData = result !== undefined ? result : data;
    if (code === ResultEnum.SUCCESS) {
      let params = {
        code: code,
        result: responseData, // 使用 result 字段返回
        data: responseData, // 同时保留 data 字段以兼容旧代码
        message: message,
      };
      return params;
    }
    return response.data;
    console.log(message || "系统出错");
    return Promise.reject(new Error(message || "Error"));
  },
  async (error: any) => {
    // 处理HTTP错误
    let message = "";
    if (error.response) {
      // 服务器返回了错误状态码
      switch (error.response.status) {
        case 400:
          message = "请求错误";
          break;
        case 405:
          alert("session过期，请点击确定刷新界面。");
          getSession();
          window.location.reload();
          message = "session过期";
          break;
        case 404:
          message = "请求地址不存在";
          break;
        case 408:
          message = "请求超时";
          break;
        case 500:
          message = "服务器内部错误";
          break;
        case 501:
          message = "服务未实现";
          break;
        case 502:
          message = "网关错误";
          break;
        case 503:
          message = "服务不可用";
          break;
        case 504:
          message = "网关超时";
          break;
        default:
          message = `未知错误 ${error.response.status}`;
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      message = "网络异常，请检查您的网络连接";
    } else {
      // 请求配置有误
      message = "请求配置错误";
    }
    console.error("Response error:", message);
    return Promise.reject(error);
  }
);
// 导出axios实例
export default service;
